/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ravennet.dataobject;

import java.io.Serializable;
import java.util.ArrayList;

/**
 *
 * @author Rav
 */
public class PartidaDataObject implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private String id;
    private UsuarioDataObject usuarioUno;
    private UsuarioDataObject usuarioDos;
    private UsuarioDataObject usuarioTres;
    private UsuarioDataObject usuarioCuatro;
    private int turnoActual=1;
    private int nroJugadores=1;
    
    private boolean juegoActivo=true;
    
    private ArrayList<LetraDataObject> bolsaLetrasActual;
    
    private TableroDataObject tablero;
    
    public PartidaDataObject(){
    }
    
    public PartidaDataObject(UsuarioDataObject jugadorCreador){
        bolsaLetrasActual = getNuevaBolsaLetras();
        tablero = createTablero();
        usuarioUno = jugadorCreador;
        usuarioUno.setListaLetrasUsuario(getLetrasAleatorias(7));
        
    }
    
    public UsuarioDataObject getJugador(String nombre){
        
        if(usuarioUno==null){
            return null;
        }
        if(usuarioUno.getNombre().equals(nombre)){
            return usuarioUno;
        }
        
        if(usuarioDos==null){
            return null;
        }
        if(usuarioDos.getNombre().equals(nombre)){
            return usuarioDos;
        }
        
        if(usuarioTres==null){
            return null;
        }
        if(usuarioTres.getNombre().equals(nombre)){
            return usuarioTres;
        }
        
        if(usuarioCuatro==null){
            return null;
        }
        if(usuarioCuatro.getNombre().equals(nombre)){
            return usuarioCuatro;
        }
        
        return null;
    }
    
    public boolean isPartidaLlena(){
        return usuarioCuatro!=null && usuarioTres!=null && usuarioDos!=null && usuarioUno!=null;
    }
    
    public void addUsuarioAPartida(String nombre) throws Exception{
        
        if(usuarioUno==null){
            usuarioUno = new UsuarioDataObject();
            usuarioUno.setNombre(nombre);
            usuarioUno.setListaLetrasUsuario(this.getLetrasAleatorias(7));
            nroJugadores++;
            return;
        }else{
            if(usuarioUno.getNombre().equals(nombre)){
                throw new Exception("El usuario "+nombre+" ya existe en esta partida");
            }
        }
        if(usuarioDos==null){
            usuarioDos = new UsuarioDataObject();
            usuarioDos.setNombre(nombre);
            usuarioDos.setListaLetrasUsuario(this.getLetrasAleatorias(7));
            nroJugadores++;
            return;
        }else{
            if(usuarioDos.getNombre().equals(nombre)){
                throw new Exception("El usuario "+nombre+" ya existe en esta partida");
            }
        }
        
        if(usuarioTres==null){
            usuarioTres = new UsuarioDataObject();
            usuarioTres.setNombre(nombre);
            usuarioTres.setListaLetrasUsuario(this.getLetrasAleatorias(7));
            nroJugadores++;
            return;
        }else{
            if(usuarioTres.getNombre().equals(nombre)){
                throw new Exception("El usuario "+nombre+" ya existe en esta partida");
            }
        }
        
        
        if(usuarioCuatro==null){
            usuarioCuatro = new UsuarioDataObject();
            usuarioCuatro.setNombre(nombre);
            usuarioCuatro.setListaLetrasUsuario(this.getLetrasAleatorias(7));
            nroJugadores++;
            return;
        }else{
            if(usuarioCuatro.getNombre().equals(nombre)){
                throw new Exception("El usuario "+nombre+" ya existe en esta partida");
            }
        }
        
        throw new Exception("Partida Llena");
    }
    
    public UsuarioDataObject getUsuarioTurno(){
        
        switch(turnoActual){
            case 1:
                return usuarioUno;
            case 2:
                return usuarioDos;
            case 3: 
                return usuarioTres;
            case 4:
                return usuarioCuatro;
            default:
                return usuarioUno;     
        }
    }
    
    public void siguienteTurno(){
        if(this.turnoActual>=nroJugadores){
            turnoActual=1;
        }else{
            this.turnoActual++;
        }
    }
    
    /**
     * Asigna la jugada en el tablero.
     * @param jugador
     * @param jugada la jugada se compone de la colocación de una o más letras, el formato de esta colocación es el siguiente:
     *          int fila, int columna,String letra . Dado que se jugarán mas de una letra en una jugada el formato de la jugada total
     *          será separar las letras individuales con ; .  ej: 1,1,A;1,2,R;1,3,B;1,4,O;1,5,L
     * @return el número de letras que jugó, para ser reemplazadas al jugador que realizó la jugada.
     
     */
    public int realizarJuagada(String jugador,String jugada){
        String[] jugadas = jugada.split(";");
        for(int x=0; x<jugadas.length; x++){
            String[] letra = jugadas[x].split(",");
            int i = Integer.parseInt(letra[0]);
            int j = Integer.parseInt(letra[1]);
            this.getTablero().setCasilla(i, j, letra[2]);
        }
        return jugadas.length;
    }
    
    public TableroDataObject createTablero() {
        
        CasillaDataObject[][] tablero = new CasillaDataObject[15][15];
        for(int i=0; i<15; i++){
            for(int j=0; j<15; j++){
                tablero[i][j] = new CasillaDataObject();
                tablero[i][j].setLetraAsignada(new LetraDataObject());
            }
        }
        
        tablero[0][0].setModificador("triplePalabra");
        tablero[0][7].setModificador("triplePalabra");
        tablero[0][14].setModificador("triplePalabra");
        tablero[7][0].setModificador("triplePalabra");
        tablero[7][14].setModificador("triplePalabra");
        tablero[14][0].setModificador("triplePalabra");
        tablero[14][7].setModificador("triplePalabra");
        tablero[14][14].setModificador("triplePalabra");
        
        tablero[1][5].setModificador("tripleLetra");
        tablero[1][9].setModificador("tripleLetra");
        tablero[5][1].setModificador("tripleLetra");
        tablero[5][5].setModificador("tripleLetra");
        tablero[5][9].setModificador("tripleLetra");
        tablero[5][13].setModificador("tripleLetra");
        tablero[7][1].setModificador("tripleLetra");
        tablero[7][5].setModificador("tripleLetra");
        tablero[7][9].setModificador("tripleLetra");
        tablero[7][13].setModificador("tripleLetra");
        tablero[13][5].setModificador("tripleLetra");
        tablero[13][9].setModificador("tripleLetra");
        
        tablero[1][1].setModificador("doblePalabra");
        tablero[2][2].setModificador("doblePalabra");
        tablero[3][3].setModificador("doblePalabra");
        tablero[4][4].setModificador("doblePalabra");
        tablero[1][13].setModificador("doblePalabra");
        tablero[2][12].setModificador("doblePalabra");
        tablero[3][11].setModificador("doblePalabra");
        tablero[4][10].setModificador("doblePalabra");
        tablero[7][7].setModificador("doblePalabra");
        tablero[10][4].setModificador("doblePalabra");
        tablero[11][3].setModificador("doblePalabra");
        tablero[12][2].setModificador("doblePalabra");
        tablero[13][1].setModificador("doblePalabra");
        tablero[10][10].setModificador("doblePalabra");
        tablero[11][11].setModificador("doblePalabra");
        tablero[12][12].setModificador("doblePalabra");
        tablero[13][13].setModificador("doblePalabra");
        
        tablero[0][4].setModificador("dobleLetra");
        tablero[0][11].setModificador("dobleLetra");
        tablero[2][6].setModificador("dobleLetra");
        tablero[2][8].setModificador("dobleLetra");
        tablero[3][0].setModificador("dobleLetra");
        tablero[3][7].setModificador("dobleLetra");
        tablero[3][14].setModificador("dobleLetra");
        tablero[6][2].setModificador("dobleLetra");
        tablero[6][6].setModificador("dobleLetra");
        tablero[6][8].setModificador("dobleLetra");
        tablero[6][12].setModificador("dobleLetra");
        tablero[7][3].setModificador("dobleLetra");
        tablero[7][11].setModificador("dobleLetra"); 
        tablero[8][2].setModificador("dobleLetra");
        tablero[8][6].setModificador("dobleLetra");
        tablero[8][8].setModificador("dobleLetra");
        tablero[8][12].setModificador("dobleLetra");
        tablero[11][0].setModificador("dobleLetra");
        tablero[11][7].setModificador("dobleLetra");
        tablero[11][14].setModificador("dobleLetra");
        tablero[12][6].setModificador("dobleLetra");
        tablero[12][8].setModificador("dobleLetra");
        tablero[14][3].setModificador("dobleLetra");
        tablero[14][11].setModificador("dobleLetra");
        
        
        return new TableroDataObject(tablero);
          
    }
    
    
    
    public ArrayList<LetraDataObject> getBolsaLetras() {
        return bolsaLetrasActual;
    }

    public void setBolsaLetras(ArrayList<LetraDataObject> bolsaLetras) {
        this.bolsaLetrasActual = bolsaLetras;
    }
    
    public void asignarLetrasIniciales(String jugador) throws Exception{
        this.getJugador(jugador).setListaLetrasUsuario(this.getLetrasAleatorias(7));    
    }
    
    public ArrayList<LetraDataObject> getLetrasAleatorias(int nroLetras){
        
        if(this.getBolsaLetras().isEmpty()){
            return new ArrayList<LetraDataObject>();
        }
        
        ArrayList<LetraDataObject> lista = new ArrayList<LetraDataObject>();
        
        if(this.getBolsaLetras().size()<nroLetras){
            nroLetras = this.getBolsaLetras().size();
        }
        
        for(int i=0; i<nroLetras; i++){
            int index = (int)(Math.ceil(Math.random()*(this.getBolsaLetras().size()-1)));
            lista.add(this.getBolsaLetras().remove(index));    
        }    
       
        return lista;
        
    }    
    
    public ArrayList<LetraDataObject> getNuevaBolsaLetras(){
        bolsaLetrasActual = new ArrayList<LetraDataObject>();
        
        for(int i=0; i<12; i++){
            bolsaLetrasActual.add(new LetraDataObject("A", null,1,1));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("B", null,3,2));
        bolsaLetrasActual.add(new LetraDataObject("B", null,3,2));
        
        for(int i=0; i<4; i++){
            bolsaLetrasActual.add(new LetraDataObject("C", null,3,3));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("CH", null,5,4));
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("D", null,2,5));
        }
        
        for(int i=0; i<12; i++){
            bolsaLetrasActual.add(new LetraDataObject("E", null,1,6));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("F", null,4,7));
        
        bolsaLetrasActual.add(new LetraDataObject("G", null,2,8));
        bolsaLetrasActual.add(new LetraDataObject("G", null,2,8));
        
        bolsaLetrasActual.add(new LetraDataObject("H", null,4,9));
        bolsaLetrasActual.add(new LetraDataObject("H", null,4,9));
        
        for(int i=0; i<6; i++){
            bolsaLetrasActual.add(new LetraDataObject("I", null,1,10));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("J", null,8,11));
        
        //k no hay
             
        for(int i=0; i<4; i++){
            bolsaLetrasActual.add(new LetraDataObject("L", null,1,12));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("LL", null,8,13));
        
        bolsaLetrasActual.add(new LetraDataObject("M", null,3,14));
        bolsaLetrasActual.add(new LetraDataObject("M", null,3,15));
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("N", null,1,16));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("Ñ", null,8,17));
        
        for(int i=0; i<9; i++){
            bolsaLetrasActual.add(new LetraDataObject("O", null,1,18));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("P", null,3,19));
        bolsaLetrasActual.add(new LetraDataObject("P", null,3,19));
        
        bolsaLetrasActual.add(new LetraDataObject("Q", null,5,20));
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("R", null,1,21));
        }
        
        bolsaLetrasActual.add(new LetraDataObject("RR", null,8,22));
        
        for(int i=0; i<6; i++){
            bolsaLetrasActual.add(new LetraDataObject("S", null,1,23));
        }
        
        for(int i=0; i<4; i++){
            bolsaLetrasActual.add(new LetraDataObject("T", null,1,24));
        }
        
        for(int i=0; i<5; i++){
            bolsaLetrasActual.add(new LetraDataObject("U", null,1,25));
        }
        
        
        bolsaLetrasActual.add(new LetraDataObject("V", null,4,26));
        
        // w no existe
        bolsaLetrasActual.add(new LetraDataObject("X", null,8,27));
        
        bolsaLetrasActual.add(new LetraDataObject("Y", null,4,28));
        
        bolsaLetrasActual.add(new LetraDataObject("Z", null,8,29));
        
        // Comodines
        bolsaLetrasActual.add(new LetraDataObject("1", null,0,0));
        bolsaLetrasActual.add(new LetraDataObject("1", null,0,0));
        
        return bolsaLetrasActual;
/*        
        mapaLetras.put("1",new LetraDataObject("A", null,1,1));
        mapaLetras.put("2",new LetraDataObject("B", null,3,2));        
        mapaLetras.put("3",new LetraDataObject("C", null,3,3));
        mapaLetras.put("4",new LetraDataObject("CH", null,5,4));
        mapaLetras.put("5",new LetraDataObject("D", null,2,5));
        mapaLetras.put("6",new LetraDataObject("E", null,1,6));
        mapaLetras.put("7",new LetraDataObject("F", null,4,7));
        mapaLetras.put("8",new LetraDataObject("G", null,2,8));
        mapaLetras.put("9",new LetraDataObject("H", null,4,9));
        mapaLetras.put("10",new LetraDataObject("H", null,4,9));
        mapaLetras.put("11",new LetraDataObject("I", null,1,10));
        mapaLetras.put("12",new LetraDataObject("J", null,8,11));             
        mapaLetras.put("13",new LetraDataObject("L", null,1,12));
        mapaLetras.put("14",new LetraDataObject("LL", null,8,13));
        mapaLetras.put("15",new LetraDataObject("M", null,3,14));
        mapaLetras.put("16",new LetraDataObject("N", null,1,16));        
        mapaLetras.put("17",new LetraDataObject("Ñ", null,8,17));
        mapaLetras.put("18",new LetraDataObject("O", null,1,18));
        mapaLetras.put("19",new LetraDataObject("P", null,3,19));
        mapaLetras.put("20",new LetraDataObject("Q", null,5,20));
        mapaLetras.put("21",new LetraDataObject("R", null,1,21));
        mapaLetras.put("22",new LetraDataObject("RR", null,8,22));
        mapaLetras.put("23",new LetraDataObject("S", null,1,23));
        mapaLetras.put("24",new LetraDataObject("T", null,1,24));
        mapaLetras.put("25",new LetraDataObject("U", null,1,25));
        mapaLetras.put("26",new LetraDataObject("V", null,4,26));
        mapaLetras.put("27",new LetraDataObject("X", null,8,27));
        mapaLetras.put("28",new LetraDataObject("Y", null,4,28));
        mapaLetras.put("29",new LetraDataObject("Z", null,8,29));
        //letras comodin sin valor
        mapaLetras.put("-1",new LetraDataObject("A", null,0,-1));
        mapaLetras.put("-2",new LetraDataObject("B", null,0,-2));        
        mapaLetras.put("-3",new LetraDataObject("C", null,0,-3));
        mapaLetras.put("-4",new LetraDataObject("CH", null,0,-4));
        mapaLetras.put("-5",new LetraDataObject("D", null,0,-5));
        mapaLetras.put("-6",new LetraDataObject("E", null,0,-6));
        mapaLetras.put("-7",new LetraDataObject("F", null,0,-7));
        mapaLetras.put("-8",new LetraDataObject("G", null,0,-8));
        mapaLetras.put("-9",new LetraDataObject("H", null,0,-9));
        mapaLetras.put("-10",new LetraDataObject("H", null,0,-9));
        mapaLetras.put("-11",new LetraDataObject("I", null,0,-10));
        mapaLetras.put("-12",new LetraDataObject("J", null,0,-11));             
        mapaLetras.put("-13",new LetraDataObject("L", null,0,-12));
        mapaLetras.put("-14",new LetraDataObject("LL", null,0,-13));
        mapaLetras.put("-15",new LetraDataObject("M", null,0,-14));
        mapaLetras.put("-16",new LetraDataObject("N", null,0,-16));        
        mapaLetras.put("-17",new LetraDataObject("Ñ", null,0,-17));
        mapaLetras.put("-18",new LetraDataObject("O", null,0,-18));
        mapaLetras.put("-19",new LetraDataObject("P", null,0,-19));
        mapaLetras.put("-20",new LetraDataObject("Q", null,0,-20));
        mapaLetras.put("-21",new LetraDataObject("R", null,0,-21));
        mapaLetras.put("-22",new LetraDataObject("RR", null,0,-22));
        mapaLetras.put("-23",new LetraDataObject("S", null,0,-23));
        mapaLetras.put("-24",new LetraDataObject("T", null,0,-24));
        mapaLetras.put("-25",new LetraDataObject("U", null,0,-25));
        mapaLetras.put("-26",new LetraDataObject("V", null,0,-26));
        mapaLetras.put("-27",new LetraDataObject("X", null,0,-27));
        mapaLetras.put("-28",new LetraDataObject("Y", null,0,-28));
        mapaLetras.put("-29",new LetraDataObject("Z", null,0,-29));
        
        return null;
  */      
    }
    
    
    
    
    

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public TableroDataObject getTablero() {
        return tablero;
    }

    public void setTablero(TableroDataObject tablero) {
        this.tablero = tablero;
    }

    public UsuarioDataObject getUsuarioCuatro() {
        return usuarioCuatro;
    }

    public void setUsuarioCuatro(UsuarioDataObject usuarioCuatro) {
        this.usuarioCuatro = usuarioCuatro;
    }

    public UsuarioDataObject getUsuarioDos() {
        return usuarioDos;
    }

    public void setUsuarioDos(UsuarioDataObject usuarioDos) {
        this.usuarioDos = usuarioDos;
    }

    public UsuarioDataObject getUsuarioTres() {
        return usuarioTres;
    }

    public void setUsuarioTres(UsuarioDataObject usuarioTres) {
        this.usuarioTres = usuarioTres;
    }

    public UsuarioDataObject getUsuarioUno() {
        return usuarioUno;
    }

    public void setUsuarioUno(UsuarioDataObject usuarioUno) {
        this.usuarioUno = usuarioUno;
    }
    
    public int getTurnoActual() {
        return turnoActual;
    }

    public void setTurnoActual(int turnoActual) {
        this.turnoActual = turnoActual;
    }
    
    public boolean isJuegoActivo() {
        return juegoActivo;
    }

    public void setJuegoActivo(boolean juegoActivo) {
        this.juegoActivo = juegoActivo;
    }
    
}
